package com.atguigu.gmall.product.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.product.prop.MinIOProperties;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.UUID;

/**
 * @author mgx
 * @version 1.0
 * @description: 图片上传controller
 * @date 2022/10/25 10:14
 */
@RestController
@RequestMapping("/admin/product/")
public class FileUploadController {

    @Autowired
    private MinIOProperties minIOProperties;

    /**
     * 上传文件
     * /admin/product/fileUpload
     *
     * @param file
     * @return
     */
    @PostMapping("/fileUpload")
    public Result fileUpload(MultipartFile file) {
        //  准备获取到上传的文件路径！
        String url = "";

        try {
            // 使用MinIO服务的URL，端口，Access key和Secret key创建一个MinioClient对象
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(minIOProperties.getEndpointUrl())
                            .credentials(minIOProperties.getAccessKey(), minIOProperties.getSecreKey())
                            .build();
            // 检查存储桶是否已经存在
            boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minIOProperties.getBucketName()).build());
            if (isExist) {
                System.out.println("Bucket already exists.");
            } else {
                // 创建一个名为asiatrip的存储桶，用于存储照片的zip文件。
                minioClient.makeBucket(MakeBucketArgs.builder()
                        .bucket(minIOProperties.getBucketName())
                        .build());
            }
            //  定义一个文件的名称 : 文件上传的时候，名称不能重复！
            String fileName = System.currentTimeMillis() + UUID.randomUUID().toString();
            // 使用putObject上传一个文件到存储桶中。
            // 无法指定文件位置，我们使用流的方式
            minioClient.putObject(
                    PutObjectArgs.builder().bucket(minIOProperties.getBucketName()).object(fileName).stream(
                                    file.getInputStream(), file.getSize(), -1)
                            .contentType(file.getContentType())
                            .build());
            // http://172.17.0.9:9000/test/xxx.jpg
            //  文件上传之后的路径： http://39.99.159.121:9000/gmall/xxxxxx
            url = minIOProperties.getEndpointUrl() + "/" + minIOProperties.getBucketName() + "/" + fileName;
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("url:\t" + url);
        return Result.ok(url);
    }
}
